Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

203
Views
static int arr[10] la dirección de memoria siempre termina en 060

Tengo un programa de CA que se ve así

C Principal

 #include <stdio.h> #define SOME_VAR 10 static int heap[SOME_VAR]; int main(void) { printf("%p", heap); return 0; }

y genera esto cuando ejecuto el programa compilado varias veces

 0x58aa7c49060 0x56555644060 0x2f8d1f8e060 0x92f58280060 0x59551c53060 0xd474ed6e060 0x767c4561060 0xf515aeda060 0xbe62367e060

¿Por qué siempre termina en 060? ¿Y la matriz está almacenada en el montón?

Editar: estoy en Linux y tengo ASLR activado. Compilé el programa usando gcc

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Las direcciones difieren debido a ASLR (radomización del diseño del espacio de direcciones). Usando esto, el binario se puede mapear en diferentes ubicaciones en el espacio de direcciones virtuales.

El heap de variables, en contraste con su nombre, no se encuentra en el montón, sino en el bss . Por lo tanto, el desplazamiento en el espacio de direcciones es constante.

Las páginas se asignan con granularidad de página, que es de 4096 bytes (hexadecimal: 0x1000) en muchas plataformas. Esta es la razón por la que los últimos tres dígitos hexadecimales de la dirección son los mismos.

Cuando hizo lo mismo con una variable de pila , la dirección podría incluso variar en los últimos dígitos en algunas plataformas (a saber, Linux con núcleos recientes), porque la pila no solo se asigna a otro lugar, sino que también recibe una compensación aleatoria al inicio.

over 4 years ago · Santiago Trujillo Report

0

Si está utilizando Windows, el motivo es la estructura PE .

Su variable de heap se almacena en la sección .data del archivo y su dirección se calcula en función del inicio de esta sección. Cada sección se carga en una dirección de forma independiente, pero su dirección inicial es múltiplo del tamaño de la página. Debido a que no tiene otras variables, su dirección probablemente sea el inicio de la sección .data , por lo que su dirección será múltiplo del tamaño de la porción.

Por ejemplo, esta es la tabla de la versión compilada de Windows de su código: secciones La sección .text es donde está su código compilado y .data contiene su variable de heap . Cuando su PE se carga en la memoria, las secciones se cargan en direcciones diferentes y VirtualAlloc() las devuelve y serán múltiplos del tamaño de la página. Pero la dirección de cada variable es relativa al inicio de la sección que ahora tiene el tamaño de una página. Por lo tanto, siempre verá un número fijo en los dígitos inferiores. Dado que la dirección relativa del heap desde el inicio de la sección se basa en el compilador, las opciones de compilación, etc., verá un número diferente del mismo código pero compiladores diferentes, pero cada vez que se imprima se corrige.

Cuando compilo el código, noté que el heap se coloca en 0x8B0 bytes después del inicio de la sección .data . Entonces, cada vez que ejecuto este código, mi dirección termina en 0x8B0 .

over 4 years ago · Santiago Trujillo Report

0

El compilador colocó un heap en el desplazamiento de 0x60 bytes en un segmento de datos que tiene, posiblemente porque el compilador tiene otras cosas en los primeros 0x60 bytes, como los datos utilizados por el código que inicia la rutina main . Por eso ves “060”; está justo donde estaba, y no tiene gran significado.

La aleatorización del diseño del espacio de direcciones cambia las direcciones base utilizadas para varias partes de la memoria del programa, pero siempre lo hace en unidades de 0x1000 bytes (porque esto evita causar problemas con la alineación y otros problemas). Entonces ve que las direcciones fluctúan en múltiplos de 0x1000, pero los últimos tres dígitos no cambian.

La definición static int heap[SOME_VAR]; define el heap con la duración del almacenamiento estático. Las implementaciones típicas de C lo almacenan en una sección de datos generales, no en el montón. El "montón" es un nombre inapropiado para la memoria que se usa para la asignación dinámica. (Es un nombre inapropiado porque las implementaciones de malloc pueden usar una variedad de estructuras de datos y algoritmos, sin limitarse a montones. Incluso pueden usar varios métodos en una implementación).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!